home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / pc / 3DTOSHI2.ZIP / mpg3d / source / G3dsystm.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1996-04-28  |  13.0 KB  |  479 lines

  1.  
  2. // g3dsystm.cpp
  3. //
  4. // Copyright (c) 1996 by Toshiaki Tsuji, all rights reserved.
  5.  
  6. #include "stdgfx.h"
  7. #include "g3dsystm.h"
  8.  
  9. #include "g3d3ds.h"
  10. #include "g3dasc.h"
  11. #include "g3dgem.h"
  12. #include "g3dgeo.h"
  13.  
  14. G3DSYSTEM::G3DSYSTEM ()
  15.   {
  16.     G3DDraw = new G3DDRAW ();
  17.  
  18.     World = NULL;
  19.     MaterialLib = NULL;
  20.  
  21.     VisibleShapes = NULL;
  22.     ShadeFlags = SHADE_GOURAUD;
  23.     FaceFlags = FACE_TEXTURE;
  24.     DepthCueing = FALSE;
  25.     DepthScale = (float)1.0;
  26.     BlendTable = NULL;
  27.     HazeScale = (float)1.0;
  28.     HazeTable = NULL;
  29.     DoHaze = FALSE;
  30.   } // End of Constructor for G3DSYSTEM 
  31.  
  32. G3DSYSTEM::~G3DSYSTEM ()
  33.   {
  34.     if (G3DDraw!=NULL)
  35.       delete G3DDraw;
  36.     G3DDraw = NULL;
  37.  
  38.     if (VisibleShapes!=NULL)
  39.       delete VisibleShapes;
  40.     VisibleShapes = NULL;  
  41.  
  42.     if (World!=NULL)
  43.       delete World;
  44.     World = NULL;
  45.  
  46.     if (BlendTable!=NULL)
  47.       delete BlendTable;
  48.     BlendTable = NULL;
  49.       
  50.     if (HazeTable!=NULL)
  51.       delete HazeTable;
  52.     HazeTable = NULL;
  53.       
  54.     if (MaterialLib!=NULL)
  55.       delete MaterialLib;
  56.     MaterialLib = NULL;
  57.   } // End of Destructor for G3DSYSTEM 
  58.  
  59. VOID G3DSYSTEM::SetShadeFlags ( LONG Flags )
  60.   {
  61.     ShadeFlags = Flags;  
  62.   } // End of SetShadeFlags for G3DSYSTEM
  63.  
  64. VOID G3DSYSTEM::SetFaceFlags ( LONG Flags )
  65.   {
  66.     FaceFlags = Flags;  
  67.   } // End of SetFaceFlags for G3DSYSTEM
  68.   
  69. VOID G3DSYSTEM::SetDepthCueing ( BOOLEAN OnOff, float Scale )
  70.   {
  71.     DepthCueing = OnOff;
  72.     DepthScale = Scale;  
  73.   } // End of SetDepthCueing for G3DSYSTEM
  74.  
  75. VOID G3DSYSTEM::SetBlendTable ( COLORTABLE *Table )
  76.   {
  77.     BlendTable = Table;  
  78.   } // End of SetBlendTable for G3DSYSTEM
  79.  
  80. VOID G3DSYSTEM::SetHazing ( BOOLEAN OnOff, float Scale, COLORTABLE *Table )
  81.   {
  82.     DoHaze = OnOff;
  83.     HazeScale = Scale;
  84.     HazeTable = Table;  
  85.   } // End of SetHazing for G3DSYSTEM
  86.  
  87. VOID G3DSYSTEM::AllocateShapeTable ( LONG Num )
  88.   {
  89.     if (VisibleShapes!=NULL)
  90.       delete VisibleShapes;
  91.     VisibleShapes = new G3DSHAPE* [Num];        
  92.   } // End of AllocateShapeTable for G3DSYSTEM
  93.  
  94. LONG G3DSYSTEM::CountNumShapes ()
  95.   {
  96.     if (World==NULL)
  97.       return 0;
  98.     return World->CountNumShapes ();    
  99.   } // End of CountNumShapes for G3DSYSTEM
  100.  
  101. VOID G3DSYSTEM::SetDestination ( IMAGE *Dest )
  102.   {
  103.     if (G3DDraw!=NULL)
  104.       {
  105.         G3DDraw->SetDestination ( Dest );  
  106.       } // End if  
  107.   } // End of SetDestination for G3DSYSTEM
  108.  
  109. VOID G3DSYSTEM::SetViewDistance ( float ViewDistance )
  110.   {
  111.     if (G3DDraw!=NULL)
  112.       {
  113.         G3DDraw->SetViewDistance ( ViewDistance );  
  114.       } // End if  
  115.   } // End of SetViewDistance for G3DSYSTEM
  116.  
  117. VOID G3DSYSTEM::SetScreenCenter ( LONG CenterX, LONG CenterY )
  118.   {
  119.     if (G3DDraw!=NULL)
  120.       {
  121.         G3DDraw->SetScreenCenter ( CenterX, CenterY );  
  122.       } // End if  
  123.   } // End of SetScreenCenter for G3DSYSTEM
  124.  
  125. VOID G3DSYSTEM::SetMaterialLib ( G3DMATERIALLIB *NewLib )
  126.   {
  127.     MaterialLib = NewLib;  
  128.   } // End of SetMaterialLib for G3DSYSTEM
  129.   
  130. G3DMATERIAL* G3DSYSTEM::FindMaterialByName ( STRING Name )
  131.   {
  132.     if (MaterialLib==NULL)
  133.       return NULL;
  134.       
  135.     return MaterialLib->FindMaterialByName ( Name );  
  136.   } // End of FindMaterialByName for G3DSYSTEM
  137.  
  138. G3DMATERIAL* G3DSYSTEM::FindMaterialByID ( LONG SearchID )
  139.   {
  140.     if (MaterialLib==NULL)
  141.       return NULL;
  142.  
  143.     return MaterialLib->FindMaterialByID ( SearchID );  
  144.   } // End of FindMaterialByID for G3DSYSTEM
  145.  
  146. G3DMATERIAL* G3DSYSTEM::FindMaterialByIndex ( LONG Index )
  147.   {
  148.     if (MaterialLib==NULL)
  149.       return NULL;
  150.  
  151.     if ((Index<0)||(Index>=MaterialLib->GetNumMaterials()))
  152.       return NULL;
  153.       
  154.     return MaterialLib->GetMaterial ( Index );  
  155.   } // End of FindMaterialByIndex for G3DSYSTEM
  156.  
  157. VOID G3DSYSTEM::SetWorld ( G3DWORLD *NewWorld, BOOLEAN DeleteOld )
  158.   {
  159.     if ((World!=NULL)&&(DeleteOld))
  160.       delete World;        
  161.     World = NewWorld;  
  162.   } // End of SetWorld for G3DSYSTEM
  163.  
  164. int CompareShape ( const void *Elem1, const void *Elem2 )
  165.   {
  166.     G3DSHAPE *Shape1 = (*(G3DSHAPE**)Elem1);  
  167.     G3DSHAPE *Shape2 = (*(G3DSHAPE**)Elem2);
  168.  
  169.     if (Shape1->MinZ>Shape2->MaxZ)
  170.       return -1;
  171.     if (Shape1->MaxZ<Shape2->MinZ)
  172.       return 1;
  173.  
  174.     if (Shape1->MinZ>Shape2->MinZ)
  175.       return -1;
  176.     if (Shape1->MinZ<Shape2->MinZ)
  177.       return 1;
  178.       
  179.     if (Shape1->MaxZ>Shape2->MaxZ)
  180.       return -1;
  181.     if (Shape1->MaxZ<Shape2->MaxZ)
  182.       return 1;
  183.               
  184.     return 0;  
  185.   } // End of CompareShape
  186.  
  187. VOID G3DSYSTEM::PainterSort ()
  188.   {
  189.     qsort ( VisibleShapes, NumVisibleShapes, sizeof(G3DSHAPE*),
  190.             CompareShape ); 
  191.   } // End of PainterSort for G3DSYSTEM
  192.  
  193. BOOLEAN G3DSYSTEM::Init ()
  194.   {
  195.     BOOLEAN Result;  
  196.     if (World==NULL)
  197.       return FAILURE;
  198.     Result = World->Init ();
  199.  
  200.     if (Result)
  201.       {
  202.         LONG NumShapes;
  203.         NumShapes = CountNumShapes ();
  204.         AllocateShapeTable ( NumShapes*2 );  
  205.       } // End if
  206.     return Result;  
  207.   } // End of Init for G3DSYSTEM
  208.  
  209. G3DOBJECT* G3DSYSTEM::FindObjectByName ( STRING SearchName )
  210.   {
  211.     if (World==NULL)
  212.       return NULL;
  213.     return World->FindObjectByName ( SearchName );    
  214.   } // End of FindObjectByName for G3DSYSTEM 
  215.  
  216. G3DOBJECT* G3DSYSTEM::FindObjectByID ( LONG SearchID )
  217.   {
  218.     if (World==NULL)
  219.       return NULL;
  220.     return World->FindObjectByID ( SearchID );    
  221.   } // End of FindObjectByID for G3DSYSTEM 
  222.  
  223. INT G3DSYSTEM::Get3DFileType ( FILEHANDLE f )
  224.   {
  225.     SHORT ID;
  226.     
  227.     if (File.Read ( f, &ID, 2  )==FAILURE)  
  228.       return -1;
  229.  
  230.     // Check for 3DS file
  231.     if (ID==CHUNK_PRIMARY)  // 3DS File?
  232.       {
  233.         return FILE_3DS;
  234.       } // End if
  235.  
  236.     CHAR TypeStr[128];
  237.  
  238.     // Check for ASC file
  239.     File.Seek ( f, 0, FROM_BEGIN );
  240.     if (File.Read ( f, TypeStr, 7 )==FAILURE)
  241.       return -1;
  242.     if (strncmp ( TypeStr, "Ambient", 7)==0)
  243.       return FILE_ASC;    
  244.  
  245.     // Check for GEO file
  246.     File.Seek ( f, 0, FROM_BEGIN );
  247.     if (File.Read ( f, TypeStr, 4 )==FAILURE)
  248.       return -1;
  249.     if (strncmp ( TypeStr, "3DG1", 4)==0)
  250.       return FILE_GEO;    
  251.  
  252.     return FILE_GEM;  // Default to GEM file
  253.   } // End of Get3DFileType for G3DSYSTEM
  254.   
  255. BOOLEAN G3DSYSTEM::Load3DFile ( STRING FileName, LINKEDLIST<G3DOBJECT*> *ObjectList,
  256.                                 BOOLEAN ClockWise, double Scale )
  257.   {
  258.     FILEHANDLE f;
  259.     BOOLEAN Result;
  260.     
  261.     f = File.Open ( FileName, OPEN_READ | OPEN_BINARY );
  262.     if (f==NULL)
  263.       return FAILURE;
  264.  
  265.     INT Type;
  266.  
  267.     Type = Get3DFileType ( f );
  268.     File.Seek ( f, 0, FROM_BEGIN );
  269.  
  270.     G3DFILETOOL *G3DFileTool=NULL;
  271.     switch (Type)
  272.       {
  273.         case FILE_ASC :
  274.           G3DFileTool = new G3DASCTOOL ();
  275.           break; 
  276.         case FILE_3DS :
  277.           G3DFileTool = new G3D3DSTOOL ();
  278.           break;
  279.         case FILE_GEM :
  280.           G3DFileTool = new G3DGEMTOOL ();
  281.           break;
  282.         case FILE_GEO :
  283.           G3DFileTool = new G3DGEOTOOL ();
  284.           break;
  285.         default :
  286.           G3DFileTool = NULL;
  287.           break;
  288.       } // End switch
  289.  
  290.     if (G3DFileTool!=NULL)
  291.       {
  292.         Result = G3DFileTool->Load ( f, ObjectList, ClockWise, Scale );
  293.         delete G3DFileTool;
  294.       } // End if  
  295.     else
  296.       Result = FAILURE;
  297.         
  298.     File.Close ( f );
  299.     return Result;
  300.   } // End of Load3DFile for G3DSYSTEM                             
  301.  
  302. BOOLEAN G3DSYSTEM::Save3DFile ( STRING FileName, LINKEDLIST<G3DOBJECT*> *ObjectList,
  303.                                 BOOLEAN ClockWise, double Scale, INT Type )
  304.   {
  305.     FILEHANDLE f;
  306.     BOOLEAN Result;
  307.     
  308.     f = File.Open ( FileName, OPEN_WRITE | OPEN_BINARY );
  309.     if (f==NULL)
  310.       return FAILURE;
  311.  
  312.     File.Seek ( f, 0, FROM_BEGIN );
  313.  
  314.     G3DFILETOOL *G3DFileTool=NULL;
  315.     switch (Type)
  316.       {
  317.         case FILE_ASC :
  318.           G3DFileTool = new G3DASCTOOL ();
  319.           break; 
  320.         case FILE_3DS :
  321.           G3DFileTool = new G3D3DSTOOL ();
  322.           break;
  323.         case FILE_GEM :
  324.           G3DFileTool = new G3DGEMTOOL ();
  325.           break;
  326.         case FILE_GEO :
  327.           G3DFileTool = new G3DGEOTOOL ();
  328.           break;
  329.         default :
  330.           G3DFileTool = NULL;
  331.           break;
  332.       } // End switch
  333.  
  334.     if (G3DFileTool!=NULL)
  335.       {
  336.         Result = G3DFileTool->Save ( f, ObjectList, ClockWise, Scale );
  337.         delete G3DFileTool;
  338.       } // End if  
  339.     else
  340.       Result = FAILURE;
  341.         
  342.     File.Close ( f );
  343.     return Result;
  344.   } // End of Save3DFile for G3DSYSTEM
  345.                                 
  346. VOID G3DSYSTEM::SetViewPort ( LONG x1, LONG y1, LONG x2, LONG y2 )
  347.   {
  348.     if (G3DDraw!=NULL)
  349.       G3DDraw->SetViewPort ( x1, y1, x2, y2 );  
  350.   } // End of SetViewPort for G3DSYSTEM
  351.   
  352. VOID G3DSYSTEM::SetNearClipZ ( float Z )
  353.   {
  354.     if (G3DDraw!=NULL)
  355.       G3DDraw->SetNearClipZ ( Z );  
  356.   } // End of SetNearClipZ for G3DSYSTEM
  357.  
  358. FLPVECTOR3D G3DSYSTEM::ComputeNextPos ( FLPVECTOR3D StartP, FLPVECTOR3D Angle, 
  359.                                         FLPVECTOR3D Vector )
  360.   {
  361.     G3DMATRIX Matrix;
  362.     
  363.     InitMatrix ( Matrix );
  364.     RotateXYZ ( Matrix, Angle.x, Angle.y, Angle.z );
  365.  
  366.     FLPVECTOR3D EndP;
  367.     float x,y,z;
  368.     
  369.     x = Vector.x*Matrix[0][0]+
  370.          Vector.y*Matrix[1][0]+    
  371.           Vector.z*Matrix[2][0];    
  372.     y = Vector.x*Matrix[0][1]+
  373.          Vector.y*Matrix[1][1]+    
  374.           Vector.z*Matrix[2][1];    
  375.     z = Vector.x*Matrix[0][2]+
  376.          Vector.y*Matrix[1][2]+    
  377.           Vector.z*Matrix[2][2];
  378.  
  379.     EndP.x = StartP.x + x;
  380.     EndP.y = StartP.y + y; 
  381.     EndP.z = StartP.z + z;
  382.     
  383.     return EndP;
  384.   } // End of ComputeNextPos for G3DENGINE
  385.   
  386. LONG G3DSYSTEM::CheckCollision ( FLPVECTOR3D StartPt, FLPVECTOR3D EndPt,
  387.                                  COLLIDEDATA *CollideList, LONG MaxNum,
  388.                                  float CollideDist, float Gap )
  389.   {
  390.     if (World==NULL)
  391.       return 0;
  392.  
  393.     LONG Count;
  394.  
  395.     Count = World->CheckCollision ( StartPt, EndPt, CollideList, MaxNum, CollideDist, Gap );
  396.     return Count;   
  397.   } // End of CheckColiision for G3DSYSTEM
  398.                                  
  399. VOID G3DSYSTEM::ShowView ( G3DCAMERA *Camera )
  400.   {
  401.     if (Camera==NULL)
  402.       return;
  403.     if (World==NULL)
  404.       return;
  405.           
  406.     InitMatrix ( ViewMatrix );
  407.  
  408.     FLPVECTOR3D CamAngle,CamPos;
  409.     CamAngle = Camera->GetAngle ();
  410.     CamPos = Camera->GetWorldPosition ();
  411.     Translate ( ViewMatrix, -CamPos.x, -CamPos.y, -CamPos.z );
  412.     RotateYXZ ( ViewMatrix, -CamAngle.x, -CamAngle.y, -CamAngle.z );
  413.  
  414.     CAMERADATA CameraData;
  415.     CameraData.CameraPoint = CamPos;
  416.     CameraData.NumVisibleShapes = 0;
  417.     CameraData.VisibleShapes = VisibleShapes;
  418.     CameraData.CenterX = (float)G3DDraw->GetCenterX();
  419.     CameraData.CenterY = (float)G3DDraw->GetCenterY();
  420.     CameraData.ViewDistance = G3DDraw->GetViewDistance();
  421.     CameraData.ViewPort = G3DDraw->GetViewPort ();
  422.     CameraData.NearClipZ = G3DDraw->GetNearClipZ ();
  423.     CameraData.ShadeFlags = ShadeFlags;
  424.     CameraData.FaceFlags = FaceFlags;
  425.     CameraData.DepthCueing = DepthCueing;
  426.     CameraData.DepthScale = DepthScale;
  427.     
  428.     if (HazeTable!=NULL)
  429.       {
  430.         CameraData.DoHaze = DoHaze;
  431.         CameraData.HazeScale = HazeScale;
  432.         CameraData.HazeLevels = HazeTable->GetNumLevels();
  433.       } // End if
  434.     else  
  435.       {
  436.         CameraData.DoHaze = FALSE;
  437.         CameraData.HazeScale = HazeScale;
  438.         CameraData.HazeLevels = 0;
  439.       } // End if
  440.  
  441.     World->TransformWorldToCamera ( ViewMatrix, &CameraData );
  442.  
  443.     NumVisibleShapes = CameraData.NumVisibleShapes;
  444.     
  445.     PainterSort ();
  446.  
  447.     LONG i;
  448.     G3DDraw->ShadeFlags = ShadeFlags;
  449.     G3DDraw->FaceFlags = FaceFlags;
  450.     G3DDraw->BlendTable = BlendTable;
  451.     G3DDraw->DoHaze = DoHaze;
  452.     G3DDraw->HazeTable = HazeTable;
  453.     
  454.     for (i=0;i<NumVisibleShapes;i++)
  455.       {
  456.         G3DDraw->DrawShape ( VisibleShapes[i] );
  457.       } // End for
  458.   } // End of ShowView for G3DSYSTEM
  459.  
  460. // For benchmark purpose
  461. VOID G3DSYSTEM::TestDrawTriangle ( FXPPOINT2D *Points, ANIMIMAGE *Texture,
  462.                                    LONG Intensity, LONG Color, LONG DrawShadeFlags,
  463.                                    LONG DrawFaceFlags, COLORTABLE *BlendTBL, COLORTABLE *ShadeTBL,
  464.                                    COLORTABLE *HazeTBL )
  465.   {
  466.     G3DDraw->TestDrawTriangle ( Points, Texture, Intensity, Color, DrawShadeFlags,
  467.                                 DrawFaceFlags,  BlendTBL, ShadeTBL, HazeTBL );
  468.   } // End of TestDrawTriangle for G3DSYSTEM
  469.  
  470. VOID G3DSYSTEM::TestDrawTriangle2 ( FXPPOINT2D *Points, ANIMIMAGE *Texture,
  471.                                     LONG Intensity, LONG Color, LONG DrawShadeFlags,
  472.                                     LONG DrawFaceFlags, COLORTABLE *BlendTBL, COLORTABLE *ShadeTBL,
  473.                                     COLORTABLE *HazeTBL )
  474.   {
  475.     G3DDraw->TestDrawTriangle2 ( Points, Texture, Intensity, Color, DrawShadeFlags,
  476.                                  DrawFaceFlags,  BlendTBL, ShadeTBL, HazeTBL );
  477.   } // End of TestDrawTriangle2 for G3DSYSTEM
  478.  
  479.